import store from "/store/index.js";
// api URL
const apiUrl = store.state.gateway;

// 封装微信请求方法
// params:接口入参
// hasCatch:用户逻辑主动捕获异常，此处不处理只抛出
const request = async (params, hasCatch) => {
	let timer;
	// 延时loading，为了解决快速响应的接口时loading闪现
	const delayTask = new Promise(resolve => {
		const delayTime = store.state.loading > 0 ? 0 : 20;
		timer = setTimeout(() => store.commit('showLoading'), delayTime);
	});

	// 登录鉴权验证
	let token = uni.getStorageSync('login').token;
	// 头信息
	let header = {
		"Content-Type": "application/json"
	};
	// 请求类型
	let method = params.method;
	// 地址及参数
	// 地址及参数
	let urlToken = !!token ? `${params.url.indexOf('?') >= 0 ? '&' : '?'}token=${token}` : '';
	let urlPath = `${params.url}${urlToken}`;
	let data = {
		...params.data
	}
	// request起飞
	const mainTaskRes = new Promise((resolve, reject) => {
		uni.request({
			url: apiUrl + urlPath, // api url
			data: data, // 请求参数
			method: method, // get/post
			header: header, // 头部
			success(res) {
				// 请求成功
				// console.log("request success res ===> ", JSON.stringify(res));
				// 判断状态码---errCode状态根据后端定义来判断
				if (res.statusCode === 200 && res.data.code === 0) {
					resolve(res.data.data || true);
				} else {
					reject(res);
				}
			},
			fail(err) {
				reject(err);
			},
			complete() {
				setTimeout(() => {
					if (timer) clearTimeout(timer);
					store.commit('hideLoading');
				});
			},
		});
	}).then((res) => {
		// console.log("then res ===> ", JSON.stringify(res));
		return res;
	}).catch((err) => {
		console.log("catch err ===> ", JSON.stringify(err));
		if (hasCatch) {
			return err;
		} else {
			showErr(err);
		}
	});
	return mainTaskRes;
};

const showErr = (e) => {
	if (e) {
		// 统一处理状态码
		// success: 显示成功图标，
		// error: 显示错误图标；
		// fail: 显示错误图标， 此时title文本无长度显示；
		// exception: 显示异常图标， 此时title文本无长度显示；
		// loading: 显示加载图标； none: 不显示图标。 注意： 有平台差异

		// 目前大致是0：正常，400：参数错误，401：系统网络错误，402：权限不正确(不一定准确)
		setTimeout(() => {
			if (e.statusCode && e.statusCode < 400) {
				switch (e.statusCode) {
					case 200:
						uni.showToast({
							title: e.data.msg || "参数错误！",
							icon: "none",
							duration: 3000,
						});
						break;
					default:
						uni.showToast({
							title: e.data.msg || "未知错误！",
							icon: "error"
						});
						break;
				}
			} else if (e.statusCode === 400) {
				uni.showToast({
					title: e.data.msg || "参数错误！",
					icon: "none"
				});
			} else if (e.statusCode === 401) {
				uni.showToast({
					title: e.data.msg || "登录失效！",
					icon: "none"
				});
				// 登錄失效
				store.commit('login/clearLoginInfo');
			} else if (e.errMsg && e.errMsg.indexOf('request:fail') !== -1) {
				uni.showToast({
					title: e.data.msg || "网络异常！",
					icon: "error"
				});
			} else {
				uni.showToast({
					title: e.data.msg || "未知异常！",
					icon: "error"
				});
			}
		});
	}
}

export {
	apiUrl,
	request,
}